package com.nuanshui.framework.utils;

import com.alibaba.fastjson.JSON;
import com.baomidou.kisso.ApiToken;
import com.baomidou.kisso.common.util.RandomUtil;
import com.nuanshui.framework.lang.SysStringUtils;
import com.nuanshui.framework.utils.redis.JedisUtil;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SSOTokenUtil {
	
	private String domain;//访问的服务器
	private String path;//访问的地址	
	private boolean httpOnly = true; //	
	private  final String CUT_SYMBOL = "#";//分隔符
	public String SSO_TOKEN_KEY = "user_info_v1";
	public JedisUtil jedisUtil;
	
	
	public String getDomain() {
		return domain;
	}
	public void setDomain(String domain) {
		this.domain = domain;
	}
	public String getPath() {
		return path;
	}
	public void setPath(String path) {
		this.path = path;
	}
	public JedisUtil getJedisUtil() {
		return jedisUtil;
	}
	public void setJedisUtil(JedisUtil jedisUtil) {
		this.jedisUtil = jedisUtil;
	}
	/**
	 * 生成token
	 * @param 
	 * @author guohao
	 * @date 2016年3月24日 上午11:37:00
	 */
	public String generateToken(String userId,HttpServletResponse response) {
		/*
		 * 此处 token 采用随机 10位字符 访问票据 accessToken = ui#token 需要缓存，例如
		 * 10 分钟即该访问票据有效时间 10 分钟，失效需要重新申请。
		 */
		String token = RandomUtil.getCharacterAndNumber(10);
		String accessToken = userId +CUT_SYMBOL + token;
		ApiToken apiToken = new ApiToken(token, accessToken);
		Cookie cookie = new Cookie(SSO_TOKEN_KEY,apiToken.getAccessToken());
		cookie.setDomain(domain);
		cookie.setPath(path);
		cookie.setHttpOnly(httpOnly);
		//cookie.setMaxAge(3600*24);
		response.addCookie(cookie);
		
		return apiToken.getAccessToken();
	}
	/**
	 * 校验token
	 * @param 
	 * @author guohao
	 * @date 2016年3月24日 上午11:42:30
	 */
	public boolean validToken(HttpServletRequest request) {
	    return getTokenFromCookie(request) != null;
	}
	
	/**
	 * 从cookie中获取token
	 * @param 
	 * @author guohao
	 * @date 2016年3月24日 上午11:49:22
	 */
	public ApiToken  getTokenFromCookie(HttpServletRequest request) {
		Cookie cookies[] =  request.getCookies();
		if(cookies == null) return null;
		for(Cookie cookie :cookies) {
			if(SSO_TOKEN_KEY.equals(cookie.getName())) {
				String tokenStr = jedisUtil.get(cookie.getValue());
			    if(SysStringUtils.isNotEmpty(tokenStr)) {
			    	return JSON.parseObject(tokenStr,ApiToken.class);
			    }
			}
		}
		return null;
	}	
	/**
	 * 从cookie中获取用户id
	 * @param 
	 * @author guohao
	 * @date 2016年3月24日 上午11:54:46
	 */
	public String  getUserIdFromCookie(HttpServletRequest request) {
		Cookie cookies[] =  request.getCookies();
		if(cookies == null) return null;
		for(Cookie cookie :cookies) {
			if(SSO_TOKEN_KEY.equals(cookie.getName())) {
				try {
					String accessTokenStr = ApiToken.decryptAccessToken(cookie.getValue());
				    int index  = -1;
					if((index = accessTokenStr.indexOf(CUT_SYMBOL)) >-1) {
				    	String userId = accessTokenStr.substring(0,index);
				    	return userId;
				    }
				} catch (Exception e) {
					return null;
				}

			}
		}
		return null;
	}	
}
